package com.shujia.wyh.day19;

import java.util.ArrayList;
import java.util.Iterator;

/*
        在正常写过程中,我们尝试往集合中添加不同类型的数据,在遍历向下转型的时候,会报错,类型转换异常错误
        如果有一种办法在我们向集合添加数据的同时,告诉我哪些可以存,哪些不能存,这样的话,我们在写代码的同时就能发现问题并修改
        而就不需要在等到运行结果报错后再去修改,这样会很麻烦.
        我们之前学过一种容器,在定义的时候,就明确容器中只能存何种数据类型的数据.---数组
        int[] arr = new int[3];
        arr[0] = 10;
        //arr[2] = "hello";
        如果集合中有一个办法可以模仿着数组,在定义时候就限定集合只能某种数据类型数据就好了
        java替我们考虑到了这一点,提供了一个技术给我们使用,这个技术就叫做泛型.

        泛型:泛型是一种特殊的类型，它把指定类型的工作推迟到客户端代码声明并实例化类或方法的时候进行。
        这样的做法有点像把数据类型当作参数一样进行传递,泛型又称之为参数化类型.

        语句定义格式:<引用数据类型>
            注意:尖括号中只能存放引用数据类型

        泛型的好处:
            1、将我们之前运行时候出现的问题，提前到了写代码的时期（编译时期）
            2、去除大部分的黄色警告线，使我们的代码更加简洁
            3、不用进行强制类型转换了（向下转型）


 */
public class GenericDemo1 {
    public static void main(String[] args) {
        //创建ArrayList集合对象
        //JDK1.7之后,会自动类型推断
        ArrayList<String> arrayList = new ArrayList<>();

        //向集合中添加元素
        arrayList.add("hello");
        arrayList.add("world");
        arrayList.add("java");
        arrayList.add("hadoop");
//        arrayList.add(20);  //因为后面做了一步向下转型的操作,转String类型,而这里是Integer类型,所以运行报错

        //获取迭代器对象
//        Iterator iterator = arrayList.iterator();
        Iterator<String> iterator = arrayList.iterator();

        while (iterator.hasNext()) {
//            Object next = iterator.next();
//            String s = (String) next;
//            System.out.println(s + "---" + s.length());
            String next = iterator.next();
            System.out.println(next+"---"+next.length());
        }
    }
}
